Introduction
Purpose
This is a quick baseline update to Andy Barclay’s 2015 Kodiak chum baseline. This baseline update includes 3 new collections sampled by ADF&G staff (Birch Foster) in 2017:
- CMBARL17 - Barling Bay Creek - 9/1/2017
- CMKIAV17 - Kiavak Portage - 9/1/2017
- CMNATA17 - Natalia Bay Creek - 9/1/2017
The purpose of this baseline update was to gather pre-hatchery population structure for spawning aggregates proximate to Barling Bay Creek (potential brood source) and Three Saints Bay (potential remote release site).
Background
Andy’s work in late 2015 was done to assess population genetic structure of chum salmon in SE Kodiak, specifically in the Three Saints Bay area. Kodiak Regional Aquaculture Association (KRAA) wanted to establish a new hatchery in Old Harbor to make early-run chum salmon for a remote release site in Three Saints Bay. KRAA intended to use the Sturgeon broodstock that they already use for their Kitoi Bay facility. ADF&G regional staff indicated that there are known early-run chum stocks in the Three Saints Bay area, which would present a genetic risk to using Sturgeon River broodstock in the area (similar run timing, but potentially genetically different). Regional staff indicated that Barling Bay Creek in particular had early-run chum salmon. Thus, regional staff collected temporal samples throughout the season from Barling Bay Creek and other nearby systems to get a better understanding of population genetic structure in SE Kodiak to determine whether early-run Barling Bay Creek chum were sufficiently distinct from Sturgeon River chum to be an unaccpetable genetic risk. Ultimately, this work did show that Barling Bay Creek has significant temporal genetic structure throughout the season (July vs. August vs. September). These results resulted in a memo with a department recommendation to use local broodstock (early-run Barling Bay Creek) rather than Sturgeon River broodstock from Kitoi Bay for the Three Saints Bay project.
This 2018 baseline update will incorporate three additional collections made by ADF&G staff. The results from this baseline update are not going to change the decision regarding use of local broodsource, they are intended to provide some additional pre-hatchery baseline stock structure information. It is not expected that these new 2017 collections will change any genetic recommendations, they are merely presented here to follow up with stakeholders.
Outline
This R Notebook will perform the following tasks:
- Review basline information
- Map of populations
- Sample size of populations
- Explore genetic structure
Genetic structure
For all genetic structure work below, we use Fst as our metric of among population genetic structure.
Heatmap of Fst
Below is a heatmap of Fst

Multi-dimensional scaling plots
Another way to visualize these Fst differences is with a 3-dimensional scaling plot.
All populations
Make an MDS of the Fst data for comparison to Andy’s work back in 2015. Note these MDS plots are interactive, you can zoom in/out with the mousewheel and rotate the plot by clicking and dragging. Also, the numbers in the MDS are the population number (pop_no), not the map number (map_no).
Kodiak populations
Make an MDS of the Fst data for just Kodiak populations. Note these MDS plots are interactive, you can zoom in/out with the mousewheel and rotate the plot by clicking and dragging. Also, the numbers in the MDS are the population number (pop_no), not the map number (map_no).
Kodiak populations, no outliers
Remove Sturgeon/Kito Bay populations, Karluk Lagoon, Gull Cape Lagoon, Big Sukhoi, and Sitkinak Island as outliers. Identify non-Barling, non-2017 collections. Note these MDS plots are interactive, you can zoom in/out with the mousewheel and rotate the plot by clicking and dragging. Also, the numbers in the MDS are the population number (pop_no), not the map number (map_no).
Kodiak populations, no outliers, identify Barling + 2017
Remove Sturgeon/Kito Bay populations, Karluk Lagoon, Gull Cape Lagoon, Big Sukhoi, and Sitkinak Island as outliers. Identify Barling and 2017 collections.Note these MDS plots are interactive, you can zoom in/out with the mousewheel and rotate the plot by clicking and dragging. Also, the numbers in the MDS are the population number (pop_no), not the map number (map_no).
Summary
We added 3 new collections to the Kodiak chum baseline to get a better sense of population structure for SE Kodiak chum pre-hatchery:
- CMBARL17 - Barling Bay Creek - 9/1/2017
- CMKIAV17 - Kiavak Portage - 9/1/2017
- CMNATA17 - Natalia Bay Creek - 9/1/2017
Of note, the 2017 collection from Barling Bay Creek came from higher up in the drainage (Birch Foster, personal communication), but still looks very similar to the 2015 September collection. Kiavak Portage is closely related to Barling, and Natalia was bit further away from the main cluster.
This update does not change any departmental recommendations regarding the use of local broodsource (Barling Bay Creek) for a chum hatchery in Old Harbor.
LS0tDQp0aXRsZTogIktvZGlhayBDaHVtIEJhc2VsaW5lIC0gMjAxOCBVcGRhdGUgU3VtbWFyeSINCmRhdGU6ICJgciBwYXN0ZShmb3JtYXQoU3lzLkRhdGUoKSwgZm9ybWF0ID0gJyVCICVkLCAlWScpKWAiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdGhlbWU6IHVuaXRlZA0KICAgIHRvYzogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgbWVzc2FnZT1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGdlbmVwb3ApDQpsaWJyYXJ5KGFiaW5kKQ0KYmJpbmQgPC0gZnVuY3Rpb24oLi4uKSB7IGFiaW5kKC4uLiwgYWxvbmcgPSAzKSB9DQpTeXMuc2V0ZW52KFJHTF9VU0VfTlVMTCA9IFRSVUUpDQpsaWJyYXJ5KHJnbCkNCg0KLnVzZXJuYW1lIDwtICJrcnNoZWRkIg0KLnBhc3N3b3JkIDwtICIiDQpzb3VyY2UoIn4vLi4vUi9GdW5jdGlvbnMuR0NMLlIiKQ0KbG9hZF9vYmplY3RzKCIuLi8yMDE4L09iamVjdHMiKQ0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQoNCiMjIFB1cnBvc2UNCg0KVGhpcyBpcyBhIHF1aWNrIGJhc2VsaW5lIHVwZGF0ZSB0byBBbmR5IEJhcmNsYXkncyAyMDE1IEtvZGlhayBjaHVtIGJhc2VsaW5lLiBUaGlzIGJhc2VsaW5lIHVwZGF0ZSBpbmNsdWRlcyAzIG5ldyBjb2xsZWN0aW9ucyBzYW1wbGVkIGJ5IEFERiZHIHN0YWZmIChCaXJjaCBGb3N0ZXIpIGluIDIwMTc6DQoNCjEpIENNQkFSTDE3IC0gQmFybGluZyBCYXkgQ3JlZWsgLSA5LzEvMjAxNw0KMikgQ01LSUFWMTcgLSBLaWF2YWsgUG9ydGFnZSAtIDkvMS8yMDE3DQozKSBDTU5BVEExNyAtIE5hdGFsaWEgQmF5IENyZWVrIC0gOS8xLzIwMTcNCg0KVGhlIHB1cnBvc2Ugb2YgdGhpcyBiYXNlbGluZSB1cGRhdGUgd2FzIHRvIGdhdGhlciAqKnByZS1oYXRjaGVyeSBwb3B1bGF0aW9uIHN0cnVjdHVyZSoqIGZvciBzcGF3bmluZyBhZ2dyZWdhdGVzIHByb3hpbWF0ZSB0byBCYXJsaW5nIEJheSBDcmVlayAocG90ZW50aWFsIGJyb29kIHNvdXJjZSkgYW5kIFRocmVlIFNhaW50cyBCYXkgKHBvdGVudGlhbCByZW1vdGUgcmVsZWFzZSBzaXRlKS4NCg0KIyMgQmFja2dyb3VuZA0KDQpBbmR5J3Mgd29yayBpbiBsYXRlIDIwMTUgd2FzIGRvbmUgdG8gYXNzZXNzIHBvcHVsYXRpb24gZ2VuZXRpYyBzdHJ1Y3R1cmUgb2YgY2h1bSBzYWxtb24gaW4gU0UgS29kaWFrLCBzcGVjaWZpY2FsbHkgaW4gdGhlIFRocmVlIFNhaW50cyBCYXkgYXJlYS4gS29kaWFrIFJlZ2lvbmFsIEFxdWFjdWx0dXJlIEFzc29jaWF0aW9uIChLUkFBKSB3YW50ZWQgdG8gZXN0YWJsaXNoIGEgbmV3IGhhdGNoZXJ5IGluIE9sZCBIYXJib3IgdG8gbWFrZSBlYXJseS1ydW4gY2h1bSBzYWxtb24gZm9yIGEgcmVtb3RlIHJlbGVhc2Ugc2l0ZSBpbiBUaHJlZSBTYWludHMgQmF5LiBLUkFBIGludGVuZGVkIHRvIHVzZSB0aGUgU3R1cmdlb24gYnJvb2RzdG9jayB0aGF0IHRoZXkgYWxyZWFkeSB1c2UgZm9yIHRoZWlyIEtpdG9pIEJheSBmYWNpbGl0eS4gQURGJkcgcmVnaW9uYWwgc3RhZmYgaW5kaWNhdGVkIHRoYXQgdGhlcmUgYXJlIGtub3duIGVhcmx5LXJ1biBjaHVtIHN0b2NrcyBpbiB0aGUgVGhyZWUgU2FpbnRzIEJheSBhcmVhLCB3aGljaCB3b3VsZCBwcmVzZW50IGEgZ2VuZXRpYyByaXNrIHRvIHVzaW5nIFN0dXJnZW9uIFJpdmVyIGJyb29kc3RvY2sgaW4gdGhlIGFyZWEgKHNpbWlsYXIgcnVuIHRpbWluZywgYnV0IHBvdGVudGlhbGx5IGdlbmV0aWNhbGx5IGRpZmZlcmVudCkuIFJlZ2lvbmFsIHN0YWZmIGluZGljYXRlZCB0aGF0IEJhcmxpbmcgQmF5IENyZWVrIGluIHBhcnRpY3VsYXIgaGFkIGVhcmx5LXJ1biBjaHVtIHNhbG1vbi4gVGh1cywgcmVnaW9uYWwgc3RhZmYgY29sbGVjdGVkIHRlbXBvcmFsIHNhbXBsZXMgdGhyb3VnaG91dCB0aGUgc2Vhc29uIGZyb20gQmFybGluZyBCYXkgQ3JlZWsgYW5kIG90aGVyIG5lYXJieSBzeXN0ZW1zIHRvIGdldCBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHBvcHVsYXRpb24gZ2VuZXRpYyBzdHJ1Y3R1cmUgaW4gU0UgS29kaWFrIHRvIGRldGVybWluZSB3aGV0aGVyIGVhcmx5LXJ1biBCYXJsaW5nIEJheSBDcmVlayBjaHVtIHdlcmUgc3VmZmljaWVudGx5IGRpc3RpbmN0IGZyb20gU3R1cmdlb24gUml2ZXIgY2h1bSB0byBiZSBhbiB1bmFjY3BldGFibGUgZ2VuZXRpYyByaXNrLiBVbHRpbWF0ZWx5LCB0aGlzIHdvcmsgZGlkIHNob3cgdGhhdCBCYXJsaW5nIEJheSBDcmVlayBoYXMgc2lnbmlmaWNhbnQgdGVtcG9yYWwgZ2VuZXRpYyBzdHJ1Y3R1cmUgdGhyb3VnaG91dCB0aGUgc2Vhc29uIChKdWx5IHZzLiBBdWd1c3QgdnMuIFNlcHRlbWJlcikuIFRoZXNlIHJlc3VsdHMgcmVzdWx0ZWQgaW4gYSBtZW1vIHdpdGggYSBkZXBhcnRtZW50IHJlY29tbWVuZGF0aW9uIHRvIHVzZSBsb2NhbCBicm9vZHN0b2NrIChlYXJseS1ydW4gQmFybGluZyBCYXkgQ3JlZWspIHJhdGhlciB0aGFuIFN0dXJnZW9uIFJpdmVyIGJyb29kc3RvY2sgZnJvbSBLaXRvaSBCYXkgZm9yIHRoZSBUaHJlZSBTYWludHMgQmF5IHByb2plY3QuDQoNClRoaXMgMjAxOCBiYXNlbGluZSB1cGRhdGUgd2lsbCBpbmNvcnBvcmF0ZSB0aHJlZSBhZGRpdGlvbmFsIGNvbGxlY3Rpb25zIG1hZGUgYnkgQURGJkcgc3RhZmYuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBiYXNlbGluZSB1cGRhdGUgYXJlIG5vdCBnb2luZyB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIHJlZ2FyZGluZyB1c2Ugb2YgbG9jYWwgYnJvb2Rzb3VyY2UsIHRoZXkgYXJlIGludGVuZGVkIHRvIHByb3ZpZGUgc29tZSBhZGRpdGlvbmFsICpwcmUtaGF0Y2hlcnkqIGJhc2VsaW5lIHN0b2NrIHN0cnVjdHVyZSBpbmZvcm1hdGlvbi4gSXQgaXMgKm5vdCogZXhwZWN0ZWQgdGhhdCB0aGVzZSBuZXcgMjAxNyBjb2xsZWN0aW9ucyB3aWxsIGNoYW5nZSBhbnkgZ2VuZXRpYyByZWNvbW1lbmRhdGlvbnMsIHRoZXkgYXJlIG1lcmVseSBwcmVzZW50ZWQgaGVyZSB0byBmb2xsb3cgdXAgd2l0aCBzdGFrZWhvbGRlcnMuDQoNCiMjIE91dGxpbmUNCg0KVGhpcyBSIE5vdGVib29rIHdpbGwgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOg0KDQogICogUmV2aWV3IGJhc2xpbmUgaW5mb3JtYXRpb24NCiAgICArIE1hcCBvZiBwb3B1bGF0aW9ucw0KICAgICsgU2FtcGxlIHNpemUgb2YgcG9wdWxhdGlvbnMNCiAgKiBFeHBsb3JlIGdlbmV0aWMgc3RydWN0dXJlDQogICAgKyBGc3QNCiAgICArIE1EUyB1c2luZyBGc3QNCg0KIyBCYXNlbGluZSBpbmZvcm1hdGlvbg0KDQojIyBNYXAgb2YgcG9wdWxhdGlvbnMNCg0KSGVyZSBpcyBtYXAgb2YgYWxsIFdlc3R3YXJkIHJlZ2lvbiBjaHVtICBiYXNlbGluZSBwb3B1bGF0aW9ucyAoZXhjbHVkaW5nIE5vcnRoIFBlbmluc3VsYSkuICoqTm90ZSoqIHRoaXMgbWFwIGlzIGludGVyYWN0aXZlLCB5b3UgY2FuIHpvb20gKG1vdXNlIHdoZWVsKSBhbmQgbmF2aWdhdGUgKGNsaWNrIGFuZCBkcmFnKS4gSWYgeW91IGNsaWNrIG9uIGEgcG9wdWxhdGlvbiwgaXQgd2lsbCBzaG93IHRoZSBwb3B1bGF0aW9uIG5hbWUuIFBvcHVsYXRpb24gbnVtYmVycyBjb3JyZXNwb25kIHRvIHRoZSBtYXAgbnVtYmVyIChgbWFwX25vYCkgaW4gdGhlIHRhYmxlIGJlbG93Lg0KYGBge3IgcG9wdWxhdGlvbl9tYXBfbnVtYmVyc30NCmljb25zIDwtIGF3ZXNvbWVJY29ucyhpY29uID0gJ2VnZycsIGljb25Db2xvciA9ICd0cmFuc3BhcmVudCcsIGxpYnJhcnkgPSAnaW9uJywgbWFya2VyQ29sb3IgPSBwb3B1bGF0aW9uc182M19pbmZvJGNvbG9yKQ0KDQpwb3B1bGF0aW9uc182M19pbmZvICU+JSANCiAgbGVhZmxldCh3aWR0aCA9ICIxMDAlIikgJT4lIA0KICBhZGRUaWxlcygpICU+JSANCiAgYWRkQXdlc29tZU1hcmtlcnMofiBMb25naXR1ZGUsIH4gTGF0aXR1ZGUsIGljb24gPSBpY29ucywgbGFiZWwgPSB+IGFzLmNoYXJhY3RlcihtYXBfbm8pLCBwb3B1cCA9IH4gTG9jYXRpb24sIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucyhub0hpZGUgPSBUUlVFLCB0ZXh0T25seSA9IFRSVUUsIGRpcmVjdGlvbiA9ICJ0b3AiKSkNCmBgYA0KDQojIyBUYWJsZSBvZiBwb3B1bGF0aW9uIGluZm9ybWF0aW9uDQoNCkJlbG93IGlzIGEgdGFibGUgc2hvd2luZyB0aGUgcG9wdWxhdGlvbnMgaW4gdGhlIGJhc2VsaW5lIGluY2x1ZGluZyBjb2xsZWN0aW9uIGRhdGUgKHNvbWUgcG9wdWxhdGlvbnMgaGF2ZSBtdWx0aXBsZSB0ZW1wb3JhbCBjb2xsZWN0aW9ucyksIHNhbXBsZSBzaXplIChuKSwgYW5kIHJlcG9ydGluZyBnb3J1cC4NCmBgYHtyIHBvcHVsYXRpb25fdGFibGV9DQpwb3B1bGF0aW9uc182M19pbmZvDQpgYGANCg0KIyBHZW5ldGljIHN0cnVjdHVyZQ0KDQpGb3IgYWxsIGdlbmV0aWMgc3RydWN0dXJlIHdvcmsgYmVsb3csIHdlIHVzZSBGc3QgYXMgb3VyIG1ldHJpYyBvZiBhbW9uZyBwb3B1bGF0aW9uIGdlbmV0aWMgc3RydWN0dXJlLg0KDQojIyBIZWF0bWFwIG9mIEZzdA0KDQpCZWxvdyBpcyBhIGhlYXRtYXAgb2YgRnN0DQpgYGB7ciBmc3RfaGVhdG1hcCwgZmlnLndpZHRoPTExLjUsIGZpZy5oZWlnaHQ9MTAsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpwb3B1bGF0aW9uc182M19pbmZvIDwtIHBvcHVsYXRpb25zXzYzX2luZm8gJT4lIA0KICBtdXRhdGUoWWVhcjEgPSB5ZWFyKG1keShgQ29sbGVjdGlvbiBEYXRlIDFgKSkpICU+JSANCiAgbXV0YXRlKFllYXIyID0geWVhcihtZHkoYENvbGxlY3Rpb24gRGF0ZSAyYCkpKSAlPiUgDQogIG11dGF0ZShZZWFyMyA9IHllYXIobWR5KGBDb2xsZWN0aW9uIERhdGUgM2ApKSkgJT4lIA0KICBncm91cF9ieShwb3Bfbm8pICU+JSANCiAgbXV0YXRlKFllYXIgPSBtYXgoWWVhcjEsIFllYXIyLCBZZWFyMywgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUoWWVhciA9IGNhc2Vfd2hlbihMb2NhdGlvbiA9PSAiWmFjaGFyeSBCYXkiIH4gYXMuZG91YmxlKGBDb2xsZWN0aW9uIERhdGUgMWApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gWWVhcikpICU+JSANCiAgdW5pdGUobmV3X2xvY2F0aW9uLCBjKExvY2F0aW9uLCBNb250aCwgWWVhciksIHNlcCA9ICJfIiwgcmVtb3ZlID0gRkFMU0UpICU+JSANCiAgdW5ncm91cChwb3Bfbm8pDQoNCnJvd25hbWVzKHBhaXJ3aXNlX2ZzdCkgPC0gY29sbmFtZXMocGFpcndpc2VfZnN0KSA8LSBwb3B1bGF0aW9uc182M19pbmZvJG5ld19sb2NhdGlvbg0KDQpnZXRfbG93ZXJfdHJpIDwtIGZ1bmN0aW9uKG1hdCkgew0KICBtYXRbdXBwZXIudHJpKG1hdCldIDwtIE5BDQogIHJldHVybihtYXQpDQp9DQoNCmdldF9sb3dlcl90cmkocGFpcndpc2VfZnN0KSAlPiUgDQogIGFzX3RpYmJsZShyb3duYW1lcyA9ICJwb3AxIikgJT4lDQogIG11dGF0ZShwb3AxID0gZmFjdG9yKHBvcDEsIHBvcHVsYXRpb25zXzYzX2luZm8kbmV3X2xvY2F0aW9uKSkgJT4lIA0KICBnYXRoZXIocG9wMiwgZnN0LCAtcG9wMSwgbmEucm0gPSBUUlVFLCBmYWN0b3Jfa2V5ID0gVFJVRSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwb3AxLCB5ID0gcG9wMiwgZmlsbCA9IGZzdCkpICsNCiAgZ2VvbV90aWxlKCkgKw0KICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJ3aGl0ZSIsIGhpZ2ggPSAiYmxhY2siKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpKSArDQogIGdndGl0bGUoIlBhaXJ3aXNlIEZzdCAtIDYzIFBvcHVsYXRpb25zLCA5MSBMb2NpIikgKw0KICB4bGFiKCJQb3B1bGF0aW9uIE5hbWUgKG1vbnRoX3llYXIpIikgKw0KICB5bGFiKCJQb3B1bGF0aW9uIE5hbWUgKG1vbnRoX3llYXIpIikNCmBgYA0KDQojIyBNdWx0aS1kaW1lbnNpb25hbCBzY2FsaW5nIHBsb3RzDQoNCkFub3RoZXIgd2F5IHRvIHZpc3VhbGl6ZSB0aGVzZSBGc3QgZGlmZmVyZW5jZXMgaXMgd2l0aCBhIDMtZGltZW5zaW9uYWwgc2NhbGluZyBwbG90Lg0KDQojIyMgQWxsIHBvcHVsYXRpb25zDQoNCk1ha2UgYW4gTURTIG9mIHRoZSBGc3QgZGF0YSBmb3IgY29tcGFyaXNvbiB0byBBbmR5J3Mgd29yayBiYWNrIGluIDIwMTUuICoqTm90ZSoqIHRoZXNlIE1EUyBwbG90cyBhcmUgaW50ZXJhY3RpdmUsIHlvdSBjYW4gem9vbSBpbi9vdXQgd2l0aCB0aGUgbW91c2V3aGVlbCBhbmQgcm90YXRlIHRoZSBwbG90IGJ5IGNsaWNraW5nIGFuZCBkcmFnZ2luZy4gQWxzbywgdGhlIG51bWJlcnMgaW4gdGhlIE1EUyBhcmUgdGhlIHBvcHVsYXRpb24gbnVtYmVyIChgcG9wX25vYCksIG5vdCB0aGUgbWFwIG51bWJlciAoYG1hcF9ub2ApLg0KYGBge3IgZnN0X21kc19hbGwsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD0xMS41LCBmaWcuaGVpZ2h0PTEwfQ0KZGlzdCA9IHBhaXJ3aXNlX2ZzdA0KcG9wdmVjID0gMTo2Mw0KZ3JvdXBzdmVjID0gMTo3DQpjb2x2ZWMgPSBtYXRjaChjb2xvcnNfN1tncm91cHZlY183XSwgY29sb3JzKCkpDQpncm91cHMgPSBncm91cHNfN1tncm91cHN2ZWNdDQpjb2xzID0gY29sb3JzXzdbZ3JvdXBzdmVjXQ0KbWFpbiA9ICIiDQpsYWJlbHMgPSBUUlVFDQpsb2NOYW1lcyA9IDE6NjMNCmF4ZXMgPSBUUlVFDQpib3ggPSBUUlVFDQphZGogPSBjKDEuNSwgMS41KQ0KY2V4ID0gMQ0Kc2l6ZSA9IDEuMw0KcG9wX25hbWVzID0gcG9wdWxhdGlvbnNfNjNfaW5mbyAlPiUgDQogIG11dGF0ZShwb3BfbmFtZSA9IGNhc2Vfd2hlbihwb3Bfbm8gJWluJSBjKDMyLCAzNywgMzgsIDMzLCA1OSwgNDYpIH4gTG9jYXRpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIiIpKSAlPiUgDQogIHB1bGwocG9wX25hbWUpDQoNCiN+fn5+fn5+fg0KbmFtZXMgPC0gaWYobGFiZWxzPT1GKXtOVUxMfSBlbHNle2lmKGxvY05hbWVzPT1GKXtwb3B2ZWN9IGVsc2V7bG9jTmFtZXNbcG9wdmVjXX19DQp4eD1kaXN0W3BvcHZlYyxwb3B2ZWNdDQp4PWFzLnZlY3RvcihjbWRzY2FsZSh4eCxrPTMpWywxXSkNCnk9YXMudmVjdG9yKGNtZHNjYWxlKHh4LGs9MylbLDJdKQ0Kej0tYXMudmVjdG9yKGNtZHNjYWxlKHh4LGs9MylbLDNdKQ0KDQpwbG90M2QoeCx5LHorYWJzKHJhbmdlKHopWzFdKSxhc3BlY3Q9Rixjb2w9Y29sb3JzKClbY29sdmVjW3BvcHZlY11dLHNpemU9c2l6ZSx0eXBlPSdzJyxtYWluPW1haW4sYm94PWJveCxheGVzPWF4ZXMsdG9wPVQsY2V4PTEseGxhYj0nJyx5bGFiPScnLHpsYWI9JycseGxlbj0wLHlsZW49MCx6bGVuPTApDQoNCnBsb3QzZCh4LHkseithYnMocmFuZ2UoeilbMV0pLGFzcGVjdD1GLGNvbD0iYmxhY2siLHNpemU9Myx0eXBlPSdoJyxib3g9RixheGVzPUYsdG9wPVQsYWRkPVQseGxhYj0nJyx5bGFiPScnLHpsYWI9JycseGxlbj0wLHlsZW49MCx6bGVuPTApDQoNCmlmKGxhYmVscz09VCl7dGV4dHMzZCh4LHkseithYnMocmFuZ2UoeilbMV0pLGFkaj1hZGosdGV4dD1uYW1lcyxmb250PTEsY2V4PWNleCxhZGQ9VCx0b3A9VCxheGVzPUYseGxhYj0nJyx5bGFiPScnLHpsYWI9JycpfQ0KaWYobGFiZWxzPT1UKXt0ZXh0czNkKHgseSx6K2FicyhyYW5nZSh6KVsxXSksYWRqPWMoLTAuMSwtMC4xKSx0ZXh0PXBvcF9uYW1lcyxmb250PTEsY2V4PWNleCxhZGQ9VCx0b3A9VCxheGVzPUYseGxhYj0nJyx5bGFiPScnLHpsYWI9JycpfQ0KDQpwYXIzZCh3aW5kb3dSZWN0ID0gYygwLCAwLCAyMDAwLCAyMDAwKSkNCg0KbGVnZW5kM2QoInRvcHJpZ2h0IiwgbGVnZW5kID0gZ3JvdXBzLCBwY2ggPSAxNiwgY29sID0gY29scywgaW5zZXQgPSBjKDApLCBjZXggPSA1KQ0KDQpyZ2x3aWRnZXQoKQ0KYGBgDQoNCiMjIyBLb2RpYWsgcG9wdWxhdGlvbnMNCg0KTWFrZSBhbiBNRFMgb2YgdGhlIEZzdCBkYXRhIGZvciBqdXN0IEtvZGlhayBwb3B1bGF0aW9ucy4gKipOb3RlKiogdGhlc2UgTURTIHBsb3RzIGFyZSBpbnRlcmFjdGl2ZSwgeW91IGNhbiB6b29tIGluL291dCB3aXRoIHRoZSBtb3VzZXdoZWVsIGFuZCByb3RhdGUgdGhlIHBsb3QgYnkgY2xpY2tpbmcgYW5kIGRyYWdnaW5nLiBBbHNvLCB0aGUgbnVtYmVycyBpbiB0aGUgTURTIGFyZSB0aGUgcG9wdWxhdGlvbiBudW1iZXIgKGBwb3Bfbm9gKSwgbm90IHRoZSBtYXAgbnVtYmVyIChgbWFwX25vYCkuDQoNCmBgYHtyIGZzdF9tZHNfa29kaWFrLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9MTEuNSwgZmlnLmhlaWdodD0xMH0NCmRpc3QgPSBwYWlyd2lzZV9mc3QNCnBvcHZlYyA9IDMyOjYzDQpjb2x2ZWMgPSBtYXRjaChjb2xvcnNfN1tncm91cHZlY183XSwgY29sb3JzKCkpDQpncm91cHMgPSBncm91cHNfN1s0OjddDQpjb2xzID0gY29sb3JzXzdbNDo3XQ0KbWFpbiA9ICIiDQpsYWJlbHMgPSBUUlVFDQpsb2NOYW1lcyA9IDE6NjMNCmF4ZXMgPSBUUlVFDQpib3ggPSBUUlVFDQphZGogPSBjKDEuNSwgMS41KQ0KY2V4ID0gMQ0Kc2l6ZSA9IDEuMw0KcG9wX25hbWVzID0gcG9wdWxhdGlvbnNfNjNfaW5mbyAlPiUgDQogIGZpbHRlcihwb3Bfbm8gJWluJSBwb3B2ZWMpICU+JSANCiAgbXV0YXRlKHBvcF9uYW1lID0gY2FzZV93aGVuKHBvcF9ubyAlaW4lIGMoMzIsIDM3LCAzOCwgMzMsIDU5LCA2MykgfiBMb2NhdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiIikpICU+JSANCiAgcHVsbChwb3BfbmFtZSkNCg0KI35+fn5+fn5+DQpuYW1lcyA8LSBpZihsYWJlbHM9PUYpe05VTEx9IGVsc2V7aWYobG9jTmFtZXM9PUYpe3BvcHZlY30gZWxzZXtsb2NOYW1lc1twb3B2ZWNdfX0NCnh4PWRpc3RbcG9wdmVjLHBvcHZlY10NCng9YXMudmVjdG9yKGNtZHNjYWxlKHh4LGs9MylbLDFdKQ0KeT1hcy52ZWN0b3IoY21kc2NhbGUoeHgsaz0zKVssMl0pDQp6PS1hcy52ZWN0b3IoY21kc2NhbGUoeHgsaz0zKVssM10pDQoNCnBsb3QzZCh4LHkseithYnMocmFuZ2UoeilbMV0pLGFzcGVjdD1GLGNvbD1jb2xvcnMoKVtjb2x2ZWNbcG9wdmVjXV0sc2l6ZT1zaXplLHR5cGU9J3MnLG1haW49bWFpbixib3g9Ym94LGF4ZXM9YXhlcyx0b3A9VCxjZXg9MSx4bGFiPScnLHlsYWI9JycsemxhYj0nJyx4bGVuPTAseWxlbj0wLHpsZW49MCkNCg0KcGxvdDNkKHgseSx6K2FicyhyYW5nZSh6KVsxXSksYXNwZWN0PUYsY29sPSJibGFjayIsc2l6ZT0zLHR5cGU9J2gnLGJveD1GLGF4ZXM9Rix0b3A9VCxhZGQ9VCx4bGFiPScnLHlsYWI9JycsemxhYj0nJyx4bGVuPTAseWxlbj0wLHpsZW49MCkNCg0KaWYobGFiZWxzPT1UKXt0ZXh0czNkKHgseSx6K2FicyhyYW5nZSh6KVsxXSksYWRqPWFkaix0ZXh0PW5hbWVzLGZvbnQ9MSxjZXg9Y2V4LGFkZD1ULHRvcD1ULGF4ZXM9Rix4bGFiPScnLHlsYWI9JycsemxhYj0nJyl9DQppZihsYWJlbHM9PVQpe3RleHRzM2QoeCx5LHorYWJzKHJhbmdlKHopWzFdKSxhZGo9YygtMC4xLC0wLjEpLHRleHQ9cG9wX25hbWVzLGZvbnQ9MSxjZXg9Y2V4LGFkZD1ULHRvcD1ULGF4ZXM9Rix4bGFiPScnLHlsYWI9JycsemxhYj0nJyl9DQoNCnBhcjNkKHdpbmRvd1JlY3QgPSBjKDAsIDAsIDIwMDAsIDIwMDApKQ0KDQpsZWdlbmQzZCgidG9wcmlnaHQiLCBsZWdlbmQgPSBncm91cHMsIHBjaCA9IDE2LCBjb2wgPSBjb2xzLCBpbnNldCA9IGMoMCksIGNleCA9IDUpDQoNCnJnbHdpZGdldCgpDQpgYGANCg0KIyMjIEtvZGlhayBwb3B1bGF0aW9ucywgbm8gb3V0bGllcnMNCg0KUmVtb3ZlIFN0dXJnZW9uL0tpdG8gQmF5IHBvcHVsYXRpb25zLCBLYXJsdWsgTGFnb29uLCBHdWxsIENhcGUgTGFnb29uLCBCaWcgU3VraG9pLCBhbmQgU2l0a2luYWsgSXNsYW5kIGFzIG91dGxpZXJzLiBJZGVudGlmeSBub24tQmFybGluZywgbm9uLTIwMTcgY29sbGVjdGlvbnMuICoqTm90ZSoqIHRoZXNlIE1EUyBwbG90cyBhcmUgaW50ZXJhY3RpdmUsIHlvdSBjYW4gem9vbSBpbi9vdXQgd2l0aCB0aGUgbW91c2V3aGVlbCBhbmQgcm90YXRlIHRoZSBwbG90IGJ5IGNsaWNraW5nIGFuZCBkcmFnZ2luZy4gQWxzbywgdGhlIG51bWJlcnMgaW4gdGhlIE1EUyBhcmUgdGhlIHBvcHVsYXRpb24gbnVtYmVyIChgcG9wX25vYCksIG5vdCB0aGUgbWFwIG51bWJlciAoYG1hcF9ub2ApLg0KYGBge3IgZnN0X21kc19rb2RpYWtfbm9fb3V0bGllcnMsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD0xMS41LCBmaWcuaGVpZ2h0PTEwfQ0KZGlzdCA9IHBhaXJ3aXNlX2ZzdA0KcG9wdmVjID0gcG9wdWxhdGlvbnNfNjNfaW5mbyAlPiUgDQogIG11dGF0ZShwb3Bfbm8gPSAxOjYzKSAlPiUgDQogIGZpbHRlcihRdWFkcmFudCA9PSAiS29kaWFrL0Fmb2duYWsgSXNsYW5kcyIpICU+JSANCiAgZmlsdGVyKEdyb3VwICE9ICJTdHVyZ2Vvbi9LaXRvaSBCYXkiKSAlPiUgDQogIGZpbHRlcighTG9jYXRpb24gJWluJSBjKCJLYXJsdWsgTGFnb29uIiwgIkd1bGwgQ2FwZSBMYWdvb24iLCAiQmlnIFN1a2hvaSIsICJTaXRraW5hayBJc2xhbmQiKSkgJT4lIA0KICBwdWxsKHBvcF9ubykNCmdyb3Vwc3ZlYyA9IDU6Nw0KY29sdmVjID0gbWF0Y2goY29sb3JzXzdbZ3JvdXB2ZWNfN10sIGNvbG9ycygpKQ0KZ3JvdXBzID0gZ3JvdXBzXzdbZ3JvdXBzdmVjXQ0KY29scyA9IGNvbG9yc183W2dyb3Vwc3ZlY10NCm1haW4gPSAiIg0KbGFiZWxzID0gVFJVRQ0KbG9jTmFtZXMgPSAxOjYzDQpheGVzID0gVFJVRQ0KYm94ID0gVFJVRQ0KYWRqID0gYygxLjUsIDEuNSkNCmNleCA9IDENCnNpemUgPSAxLjMNCnBvcF9uYW1lcyA9IHBvcHVsYXRpb25zXzYzX2luZm8gJT4lIA0KICBmaWx0ZXIocG9wX25vICVpbiUgcG9wdmVjKSAlPiUgDQogIG11dGF0ZShwb3BfbmFtZSA9IGNhc2Vfd2hlbihwb3Bfbm8gJWluJSBjKDM0LCAzNSwgMzYsIDYyLCAyNywgNjAsIDU3KSB+IExvY2F0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICIiKSkgJT4lIA0KICBwdWxsKHBvcF9uYW1lKQ0KDQojfn5+fn5+fn4NCm5hbWVzIDwtIGlmKGxhYmVscz09Ril7TlVMTH0gZWxzZXtpZihsb2NOYW1lcz09Ril7cG9wdmVjfSBlbHNle2xvY05hbWVzW3BvcHZlY119fQ0KeHg9ZGlzdFtwb3B2ZWMscG9wdmVjXQ0KeD1hcy52ZWN0b3IoY21kc2NhbGUoeHgsaz0zKVssMV0pDQp5PWFzLnZlY3RvcihjbWRzY2FsZSh4eCxrPTMpWywyXSkNCno9LWFzLnZlY3RvcihjbWRzY2FsZSh4eCxrPTMpWywzXSkNCg0KcGxvdDNkKHgseSx6K2FicyhyYW5nZSh6KVsxXSksYXNwZWN0PUYsY29sPWNvbG9ycygpW2NvbHZlY1twb3B2ZWNdXSxzaXplPXNpemUsdHlwZT0ncycsbWFpbj1tYWluLGJveD1ib3gsYXhlcz1heGVzLHRvcD1ULGNleD0xLHhsYWI9JycseWxhYj0nJyx6bGFiPScnLHhsZW49MCx5bGVuPTAsemxlbj0wKQ0KDQpwbG90M2QoeCx5LHorYWJzKHJhbmdlKHopWzFdKSxhc3BlY3Q9Rixjb2w9ImJsYWNrIixzaXplPTMsdHlwZT0naCcsYm94PUYsYXhlcz1GLHRvcD1ULGFkZD1ULHhsYWI9JycseWxhYj0nJyx6bGFiPScnLHhsZW49MCx5bGVuPTAsemxlbj0wKQ0KDQppZihsYWJlbHM9PVQpe3RleHRzM2QoeCx5LHorYWJzKHJhbmdlKHopWzFdKSxhZGo9YWRqLHRleHQ9bmFtZXMsZm9udD0xLGNleD1jZXgsYWRkPVQsdG9wPVQsYXhlcz1GLHhsYWI9JycseWxhYj0nJyx6bGFiPScnKX0NCmlmKGxhYmVscz09VCl7dGV4dHMzZCh4LHkseithYnMocmFuZ2UoeilbMV0pLGFkaj1jKC0wLjEsLTAuMSksdGV4dD1wb3BfbmFtZXMsZm9udD0xLGNleD1jZXgsYWRkPVQsdG9wPVQsYXhlcz1GLHhsYWI9JycseWxhYj0nJyx6bGFiPScnKX0NCg0KcGFyM2Qod2luZG93UmVjdCA9IGMoMCwgMCwgMjAwMCwgMjAwMCkpDQoNCmxlZ2VuZDNkKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGdyb3VwcywgcGNoID0gMTYsIGNvbCA9IGNvbHMsIGluc2V0ID0gYygwKSwgY2V4ID0gNSkNCg0Kcmdsd2lkZ2V0KCkNCmBgYA0KDQojIyMgS29kaWFrIHBvcHVsYXRpb25zLCBubyBvdXRsaWVycywgaWRlbnRpZnkgQmFybGluZyArIDIwMTcNCg0KUmVtb3ZlIFN0dXJnZW9uL0tpdG8gQmF5IHBvcHVsYXRpb25zLCBLYXJsdWsgTGFnb29uLCBHdWxsIENhcGUgTGFnb29uLCBCaWcgU3VraG9pLCBhbmQgU2l0a2luYWsgSXNsYW5kIGFzIG91dGxpZXJzLiBJZGVudGlmeSBCYXJsaW5nIGFuZCAyMDE3IGNvbGxlY3Rpb25zLioqTm90ZSoqIHRoZXNlIE1EUyBwbG90cyBhcmUgaW50ZXJhY3RpdmUsIHlvdSBjYW4gem9vbSBpbi9vdXQgd2l0aCB0aGUgbW91c2V3aGVlbCBhbmQgcm90YXRlIHRoZSBwbG90IGJ5IGNsaWNraW5nIGFuZCBkcmFnZ2luZy4gQWxzbywgdGhlIG51bWJlcnMgaW4gdGhlIE1EUyBhcmUgdGhlIHBvcHVsYXRpb24gbnVtYmVyIChgcG9wX25vYCksIG5vdCB0aGUgbWFwIG51bWJlciAoYG1hcF9ub2ApLg0KYGBge3IgZnN0X21kc19rb2RpYWtfbm9fb3V0bGllcnNfYmFybGluZywgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTExLjUsIGZpZy5oZWlnaHQ9MTB9DQpkaXN0ID0gcGFpcndpc2VfZnN0DQpwb3B2ZWMgPSBwb3B1bGF0aW9uc182M19pbmZvICU+JSANCiAgbXV0YXRlKHBvcF9ubyA9IDE6NjMpICU+JSANCiAgZmlsdGVyKFF1YWRyYW50ID09ICJLb2RpYWsvQWZvZ25hayBJc2xhbmRzIikgJT4lIA0KICBmaWx0ZXIoR3JvdXAgIT0gIlN0dXJnZW9uL0tpdG9pIEJheSIpICU+JSANCiAgZmlsdGVyKCFMb2NhdGlvbiAlaW4lIGMoIkthcmx1ayBMYWdvb24iLCAiR3VsbCBDYXBlIExhZ29vbiIsICJCaWcgU3VraG9pIiwgIlNpdGtpbmFrIElzbGFuZCIpKSAlPiUgDQogIHB1bGwocG9wX25vKQ0KZ3JvdXBzdmVjID0gNTo3DQpjb2x2ZWMgPSBtYXRjaChjb2xvcnNfN1tncm91cHZlY183XSwgY29sb3JzKCkpDQpncm91cHMgPSBncm91cHNfN1tncm91cHN2ZWNdDQpjb2xzID0gY29sb3JzXzdbZ3JvdXBzdmVjXQ0KbWFpbiA9ICIiDQpsYWJlbHMgPSBUUlVFDQpsb2NOYW1lcyA9IDE6NjMNCmF4ZXMgPSBUUlVFDQpib3ggPSBUUlVFDQphZGogPSBjKDEuNSwgMS41KQ0KY2V4ID0gMQ0Kc2l6ZSA9IDEuMw0KcG9wX25hbWVzID0gcG9wdWxhdGlvbnNfNjNfaW5mbyAlPiUgDQogIGZpbHRlcihwb3Bfbm8gJWluJSBwb3B2ZWMpICU+JSANCiAgdW5pdGUobW9udGhfeWVhciwgYyhNb250aCwgWWVhciksIHNlcCA9ICJfIiwgcmVtb3ZlID0gRkFMU0UpICU+JSANCiAgbXV0YXRlKHBvcF9uYW1lID0gY2FzZV93aGVuKHBvcF9ubyAlaW4lIGMoNTYsIDU4KSB+IExvY2F0aW9uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wX25vICVpbiUgYyg1MTo1NSkgfiBtb250aF95ZWFyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICIiKSkgJT4lIA0KICBwdWxsKHBvcF9uYW1lKQ0KDQojfn5+fn5+fn4NCm5hbWVzIDwtIGlmKGxhYmVscz09Ril7TlVMTH0gZWxzZXtpZihsb2NOYW1lcz09Ril7cG9wdmVjfSBlbHNle2xvY05hbWVzW3BvcHZlY119fQ0KeHg9ZGlzdFtwb3B2ZWMscG9wdmVjXQ0KeD1hcy52ZWN0b3IoY21kc2NhbGUoeHgsaz0zKVssMV0pDQp5PWFzLnZlY3RvcihjbWRzY2FsZSh4eCxrPTMpWywyXSkNCno9LWFzLnZlY3RvcihjbWRzY2FsZSh4eCxrPTMpWywzXSkNCg0KcGxvdDNkKHgseSx6K2FicyhyYW5nZSh6KVsxXSksYXNwZWN0PUYsY29sPWNvbG9ycygpW2NvbHZlY1twb3B2ZWNdXSxzaXplPXNpemUsdHlwZT0ncycsbWFpbj1tYWluLGJveD1ib3gsYXhlcz1heGVzLHRvcD1ULGNleD0xLHhsYWI9JycseWxhYj0nJyx6bGFiPScnLHhsZW49MCx5bGVuPTAsemxlbj0wKQ0KDQpwbG90M2QoeCx5LHorYWJzKHJhbmdlKHopWzFdKSxhc3BlY3Q9Rixjb2w9ImJsYWNrIixzaXplPTMsdHlwZT0naCcsYm94PUYsYXhlcz1GLHRvcD1ULGFkZD1ULHhsYWI9JycseWxhYj0nJyx6bGFiPScnLHhsZW49MCx5bGVuPTAsemxlbj0wKQ0KDQppZihsYWJlbHM9PVQpe3RleHRzM2QoeCx5LHorYWJzKHJhbmdlKHopWzFdKSxhZGo9YWRqLHRleHQ9bmFtZXMsZm9udD0xLGNleD1jZXgsYWRkPVQsdG9wPVQsYXhlcz1GLHhsYWI9JycseWxhYj0nJyx6bGFiPScnKX0NCmlmKGxhYmVscz09VCl7dGV4dHMzZCh4LHkseithYnMocmFuZ2UoeilbMV0pLGFkaj1jKC0wLjEsLTAuMSksdGV4dD1wb3BfbmFtZXMsZm9udD0xLGNleD1jZXgsYWRkPVQsdG9wPVQsYXhlcz1GLHhsYWI9JycseWxhYj0nJyx6bGFiPScnKX0NCg0KcGFyM2Qod2luZG93UmVjdCA9IGMoMCwgMCwgMjAwMCwgMjAwMCkpDQoNCmxlZ2VuZDNkKCJ0b3ByaWdodCIsIGxlZ2VuZCA9IGdyb3VwcywgcGNoID0gMTYsIGNvbCA9IGNvbHMsIGluc2V0ID0gYygwKSwgY2V4ID0gNSkNCg0Kcmdsd2lkZ2V0KCkNCmBgYA0KDQojIFN1bW1hcnkNCg0KV2UgYWRkZWQgMyBuZXcgY29sbGVjdGlvbnMgdG8gdGhlIEtvZGlhayBjaHVtIGJhc2VsaW5lIHRvIGdldCBhIGJldHRlciBzZW5zZSBvZiBwb3B1bGF0aW9uIHN0cnVjdHVyZSBmb3IgU0UgS29kaWFrIGNodW0gcHJlLWhhdGNoZXJ5Og0KDQoxKSBDTUJBUkwxNyAtIEJhcmxpbmcgQmF5IENyZWVrIC0gOS8xLzIwMTcNCjIpIENNS0lBVjE3IC0gS2lhdmFrIFBvcnRhZ2UgLSA5LzEvMjAxNw0KMykgQ01OQVRBMTcgLSBOYXRhbGlhIEJheSBDcmVlayAtIDkvMS8yMDE3DQoNCk9mIG5vdGUsIHRoZSAyMDE3IGNvbGxlY3Rpb24gZnJvbSBCYXJsaW5nIEJheSBDcmVlayBjYW1lIGZyb20gaGlnaGVyIHVwIGluIHRoZSBkcmFpbmFnZSAoQmlyY2ggRm9zdGVyLCBwZXJzb25hbCBjb21tdW5pY2F0aW9uKSwgYnV0IHN0aWxsIGxvb2tzIHZlcnkgc2ltaWxhciB0byB0aGUgMjAxNSBTZXB0ZW1iZXIgY29sbGVjdGlvbi4gS2lhdmFrIFBvcnRhZ2UgaXMgY2xvc2VseSByZWxhdGVkIHRvIEJhcmxpbmcsIGFuZCBOYXRhbGlhIHdhcyBiaXQgZnVydGhlciBhd2F5IGZyb20gdGhlIG1haW4gY2x1c3Rlci4NCg0KVGhpcyB1cGRhdGUgKipkb2VzIG5vdCoqIGNoYW5nZSBhbnkgZGVwYXJ0bWVudGFsIHJlY29tbWVuZGF0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiBsb2NhbCBicm9vZHNvdXJjZSAoQmFybGluZyBCYXkgQ3JlZWspIGZvciBhIGNodW0gaGF0Y2hlcnkgaW4gT2xkIEhhcmJvci4NCg==